package com.wr.rabbitmq.topics;


import com.rabbitmq.client.*;

import java.io.IOException;
import java.util.concurrent.TimeoutException;

/**
 * 主题模式（模糊匹配） 消费者
 */
public class Consumer {

    private static Runnable runnable = ()->{
        // 所有的中间件技术都是基于tcp/ip协议基础上构建的新型协议规范，RabbitMq用的是amqp

        // 1、创建连接工厂
        ConnectionFactory connectionFactory = new ConnectionFactory();
        connectionFactory.setHost("192.168.3.101");
        connectionFactory.setPort(5672);
        connectionFactory.setUsername("root");
        connectionFactory.setPassword("123456");
        connectionFactory.setVirtualHost("/");
        // 2、创建连接connection
        Channel channel = null;
        Connection connection = null;
        try {
            connection = connectionFactory.newConnection("生产者");
            // 3、通过连接获取通道Channel
            channel = connection.createChannel();  // 获取通道
            // 4、通过创建交换机、声明队列、绑定关系、路由key、发送消息和接受消息
            String queueName = Thread.currentThread().getName();
            /**
             * @params1 队列名称
             * @params2 是否需要持久化
             * @params3 排他性，是否独占独立
             * @params4 是否自动删除，消息消费完了是否自动删除
             * @params5 携带附属参数
             */
            // 5、接受消息 第一个匿名函数式打印消息，第二个是接受失败
            channel.basicConsume(queueName, true, new DeliverCallback() {
                @Override
                public void handle(String consumerTag, Delivery message) throws IOException {
                    System.out.println(queueName+":收到消息------>" + new String(message.getBody(), "utf-8"));
                }
            }, new CancelCallback() {
                @Override
                public void handle(String consumerTag) throws IOException {
                    System.out.println("接受失败");
                }
            });
            System.in.read();
        } catch (IOException e) {
            e.printStackTrace();
        } catch (TimeoutException e) {
            e.printStackTrace();
        } finally {
            // 7、关闭连接
            if (channel != null && channel.isOpen()){
                try {
                    channel.close();
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
            // 8、关闭通道

            if (connection != null && connection.isOpen()){
                try {
                    connection.close();
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        }
    };


    public static void main(String[] args) {

        new Thread(runnable,"queue1").start();
        new Thread(runnable,"queue2").start();


    }
}
